"""
关于函数的传递 我们需要记住两句话
    1. 函数的返回值可以作为 另一个函数的 参数传递
    2. 函数本身可以作为另一个 函数的 参数 进行传递
"""

# 演示： 1. 函数的返回值可以作为 另一个函数的 参数传递
def fun1():
    return 100  # 返回了一个结果 100

def fun2(num):  # 需要一个参数
    print(num)

# 调用 fun1 获取返回值
a = fun1()
print(a)

# 调用fun2,传入参数 a
fun2(a)

print('=' * 30)
# 合并版

fun2(fun1()) # 函数的返回值可以作为另一个函数的参数进行传递

print('~' * 30)

# 演示 直接写函数名，就是函数对象
def get_sum(a,b):
    return a + b

# 函数在Python中也是一个对象，存在堆中，也有地址
print(get_sum) # <function get_sum at 0x00000000012FB380>


# 直接写函数名，就是将 对象的地址 赋值给变量，那么这个变量 就拥有了和该函数一样的功能
hg = get_sum
print(hg) # <function get_sum at 0x00000000012AB380>

# 调用get_sum()
a = get_sum(1,2)
print(a)

# 调用hg
b = hg(5,8)
print(b)

print('$' * 30)

# 案例二： 2. 函数本身可以作为另一个 函数的 参数 进行传递

def get_substract(a,b):
    return a - b

# 计算器
def calculate(a,b,fun):
    """
    作用：自定义函数，模拟计算机，传入什么函数 就做什么操作
    :param a:  第一个整数
    :param b:  第二个整数
    :param fun:  具体的操作规则
    :return:  计算结果
    """
    return fun(a,b)

print(calculate(3,5,get_substract))
print(calculate(3,5,get_sum))


